﻿#This module is a manipulator for table instances


#import os
#import sys




# Настройка вывода ошибок в файл

# Определяется текущая директория

#__dir__ = os.path.dirname(os.path.abspath(__file__))
#path_error = os.path.join(__dir__, "so_test_error.log")

# Вывод ошибок перенаправляется в файл error.log в текущей директории

#sys.stderr = open(path_error, 'a')

import db




class articles:
	"This class is a manipulator for articles instances"
	#beginning of class suite
	#print (articles.__doc__)
	class fdb:
		"This class is a manipulator in Firebird"
		#beginning of class suite
		#print (articles.fdb.__doc__)

		class view:
			"This class is a manipulator for views"
			#beginning of class suite
			#print (articles.fdb.view.__doc__)
			
			class to_import:
				"This class is a manipulator for to import articles"
				#beginning of class suite
				#print (articles.fdb.view.to_import.__doc__)
				
				name='X_OASUP_ARTICLES_TO_IMPORT'
				
				def create():
					'''Function creates the view'''
					#beginning of function suite
					#print(articles.fdb.view.to_import.create.__doc__)
					
					name=articles.fdb.view.to_import.name
					#Выполняется подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество видов с именем вида присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before==0:
						# Выполняется запрос на создание вида в Firebird:
						db.firebird.cursor.execute('''CREATE VIEW '''+name+''' (art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id)
AS

select 

DISTINCT 

a.art_id, a.section_id, ss.sectname, d.doc_type, e.doc_name, a.designatio, a.name, a.note, a.mu_id, a.purchased, d.format, a.modifdate, d.version_id

     FROM articles a, articles_view av, archives ar, pc, ssections ss, doclist d, doctypes e

          WHERE
               
               e.doc_type=d.doc_type
      
               AND d.doc_id=a.doc_id
               
               AND a.section_id=ss.section_id

               AND extract(YEAR from a.chkindate)>2005

               AND a.art_id>0

               AND ar.archive_id=av.archive_id

               AND (ar.archive_id=31
                        OR ar.archive_id=34
                        OR ar.archive_id=35
                        OR ar.archive_id=36
                        OR ar.archive_id=37
                        OR ar.archive_id=38
                        OR ar.archive_id=41
                        OR ar.archive_id=42
                        OR ar.archive_id=43)

               AND CHAR_LENGTH(TRIM(a.name))>0

               AND 

                (
                 (a.art_id=pc.part_aid
                  OR a.art_id=pc.proj_aid)

                 AND av.art_id=pc.proj_aid
                 AND CHAR_LENGTH(TRIM(a.designatio))>0
                 AND (a.SECTION_ID=1
                          OR a.SECTION_ID=3
                          OR a.SECTION_ID=4
                          OR a.SECTION_ID=8)
                )

UNION ALL

select 

DISTINCT 

a.art_id, a.section_id, ss.sectname, d.doc_type, e.doc_name, a.designatio, a.name, a.note, a.mu_id, a.purchased, d.format, a.modifdate, d.version_id

     FROM 

articles a, articles_view av, archives ar, pc, ssections ss, doclist d, doctypes e

          WHERE
               
               e.doc_type=d.doc_type
      
               AND d.doc_id=a.doc_id

               AND a.section_id=ss.section_id

               AND extract(YEAR from a.chkindate)>2005

               AND a.art_id>0

               AND ar.archive_id=av.archive_id

               AND (ar.archive_id=31
                        OR ar.archive_id=34
                        OR ar.archive_id=35
                        OR ar.archive_id=36
                        OR ar.archive_id=37
                        OR ar.archive_id=38
                        OR ar.archive_id=41
                        OR ar.archive_id=42
                        OR ar.archive_id=43)

               AND CHAR_LENGTH(TRIM(a.name))>0

               AND 
                
                (
                 a.art_id=pc.part_aid
                 AND av.art_id=pc.proj_aid
                 AND CHAR_LENGTH(TRIM(a.designatio))=0
                 AND (a.SECTION_ID=5
                          OR a.SECTION_ID=6
                          OR a.SECTION_ID=7)
                );''')
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество видов с именем вида присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return after-before

				def drop():
					'''Function drops the view'''
					#beginning of function suite
					#print(articles.fdb.view.to_import.drop.__doc__)
					
					name=articles.fdb.view.to_import.name
					#Выполняется подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество видов с именем вида присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before!=0:
						# Выполняется запрос на удаление вида в Firebird:
						db.firebird.cursor.execute('''DROP VIEW '''+name+''';''')
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество видов с именем вида присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return before-after

				#end of to_import class suite
			
			#end of view class suite

		class table:
			"This class is a manipulator for tables"
			#beginning of class suite
			#print (articles.fdb.table.__doc__)

			class imported:
				"This class is a manipulator for imported articles"
				#beginning of class suite
				#print (articles.fdb.table.imported.__doc__)
				
				name='X_OASUP_ARTICLES_IMPORTED'
				
				def create():
					'''Function creates the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.create.__doc__)
					
					name=articles.fdb.table.imported.name
					#Выполняется подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество таблиц с именем таблицы присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before==0:
						# Выполняется запрос на создание генератора id для таблицы
						db.firebird.conn.execute_immediate("CREATE GENERATOR "+name+"_GEN;")
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
						# Выполняется запрос на создание таблицы:
						
					
						db.firebird.cursor.execute('''CREATE TABLE '''+name+''' 
					(
					  ID Integer NOT NULL,
					  ART_ID Integer NOT NULL,
					  VERSION_ID Integer NOT NULL,
					  INSDATE Timestamp NOT NULL,
					  INSTYPE Varchar(10) NOT NULL,
					  DB Varchar(70) NOT NULL,
					  COMMENT Varchar(252),
					  CONSTRAINT '''+name+'''_NDX PRIMARY KEY (ID)
					 );''')
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество таблиц с именем таблицы присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return after-before

				def drop():
					'''Function drops the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.drop.__doc__)
					
					name=articles.fdb.table.imported.name
					#Выполняется подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество таблиц с именем таблицы присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before!=0:
						# Выполняется запрос на удаление генератора id для таблицы
						db.firebird.conn.execute_immediate("DROP GENERATOR "+name+"_GEN;")
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
						# Выполняется запрос на удаление таблицы:
						db.firebird.cursor.execute("DROP TABLE "+name+";")
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM RDB$RELATIONS WHERE RDB$RELATION_NAME=?''', [name])
					#Количество таблиц с именем таблицы присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return before-after
			
				def insert(art_id, version_id, instype, database='postgre', comment=''):
					'''Function inserts row in the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.insert.__doc__)
										
					name=articles.fdb.table.imported.name
					#Подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name+''' WHERE art_id=? AND version_id=?''',[art_id, version_id])
					#Количество строк в таблице присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before==0:
						#Формируется транзакция вставки строки в таблицу
						db.firebird.cursor.execute("INSERT INTO "+name+" (ID, ART_ID, VERSION_ID, INSDATE, INSTYPE, DB, COMMENT) VALUES(NEXT VALUE FOR "+name+"_GEN,?,?,CURRENT_TIMESTAMP,?,?,?)",[art_id, version_id, instype, database, comment])
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name+''' WHERE art_id=? AND version_id=?''',[art_id, version_id])
					#Количество строк в таблице присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return after-before
					
				def insert_many(rows):
					'''Function inserts rows in the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.insert_many.__doc__)
					
					name=articles.fdb.table.imported.name
					#Подключение к базе данных Firebird
					db.firebird.connect()
					rows_true=[]
					artrevs=[]
					for row in rows:
						#Выполняется транзакция выборки строки в таблице
						db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name+''' WHERE art_id=? AND version_id=?''',[row[0], row[1]])
						if db.firebird.cursor.fetchall()[0][0]==0 and (row[0],row[1]) not in artrevs:
							rows_true.append(row)
							artrevs.append((row[0],row[1]))
					#Выполняется транзакция подсчета строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name)
					#Переменной before присваивается количество строк в таблице
					before=db.firebird.cursor.fetchall()[0][0]
					#Формируется транзакция вставки строк в таблицу
					db.firebird.cursor.executemany("INSERT INTO "+name+" (ID, ART_ID, VERSION_ID, INSDATE, INSTYPE, DB, COMMENT) VALUES(NEXT VALUE FOR "+name+"_GEN,?,?,CURRENT_TIMESTAMP,?,?,?)",rows_true)
					#Совершается предыдущий запрос:
					db.firebird.conn.commit()
					#Выполняется транзакция подсчета строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name)
					#Переменной after присваивается количество строк в таблице
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return after-before
					

				def delete(id):
					'''Function deletes row in the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.delete.__doc__)
					
					name=articles.fdb.table.imported.name
					#Подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name+''' WHERE id=?''',[id])
					#Количество строк в таблице присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before!=0:
						#Формируется транзакция удаления строки из таблицы
						db.firebird.cursor.execute("DELETE FROM "+name+" WHERE ID=?",[id])
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name+''' WHERE id=?''',[id])
					#Количество строк в таблице присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return before-after
				
				def empty():
					'''Function deletes all rows in the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.empty.__doc__)
					
					name=articles.fdb.table.imported.name
					#Подключение к базе данных Firebird
					db.firebird.connect()
					#Выполняется транзакция подсчета количества строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name)
					#Количество строк в таблице присваивается переменной before
					before=db.firebird.cursor.fetchall()[0][0]
					if before!=0:
						#Формируется транзакция удаления строки в таблицу X_OASUP_ARTICLES_IMPORT
						db.firebird.cursor.execute("DELETE FROM "+name)
						#Совершается предыдущий запрос:
						db.firebird.conn.commit()
					#Выполняется транзакция подсчета количества строк в таблице
					db.firebird.cursor.execute('''SELECT COUNT (*) FROM '''+name)
					#Количество строк в таблице присваивается переменной after
					after=db.firebird.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#end of function suite
					return before-after
				
				#end of imported class suite
			
			#end of table class suite

		#end of fdb class suite
		
	
	class pg:
		"This class is a manipulator for articles instances in postgre"
		#print (articles.pg.__doc__)
		#beginning of class suite
		
		class table:
			"This class is a manipulator for tables"
			#print (articles.pg.table.__doc__)
			#beginning of class suite
			
			class articles:
				"This class is a manipulator for articles"
				#print (articles.pg.table.articles.__doc__)
				#beginning of class suite
				
				name='ei_so_search_articles'
				def create():
					'''Function creates the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.create.__doc__)
					
					name=articles.pg.table.articles.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
					#Количество таблиц с именем таблицы присваивается переменной before
					before=count(name)[0][0]
					if before==0:
						#Выполняется транзакция создания таблицы
						create=db.postgre.conn.execute('''CREATE TABLE '''+name+''' 
						(
						  id serial NOT NULL, --id
						  art_id integer NOT NULL, --Search.articles
						  section_id integer NOT NULL, --Search.articles
						  sectname character varying(70) NOT NULL, --Search.ssections
						  doc_type integer NOT NULL, --Search.doclist
						  doc_name character varying(100) NOT NULL, --Search.doctypes
						  designatio character varying(80), --Search.articles
						  name character varying(250), --Search.articles
						  note character varying(252), --Search.articles
						  mu_id integer NOT NULL, --Search.articles
						  purchased character(1), --Search.articles
						  format character varying(200), --Search.doclist
						  modifdate timestamp, --Search.articles
						  version_id integer, --Search.doclist
						  prodcode integer, --Omega.konstrobj
						  CONSTRAINT '''+name+'''_pkey PRIMARY KEY (id)
						 );
						ALTER TABLE '''+name+''' OWNER TO openerp;
						COMMENT ON TABLE '''+name+''' IS 'Таблица артикулов Search';
						''')
					#Количество таблиц с именем таблицы присваивается переменной after
					after=count(name)[0][0]
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					return after-before

				def drop():
					'''Function drops the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.drop.__doc__)
					
					name=articles.pg.table.articles.name
					#Выполняется подключение к базе данных postgres с заданными параметрами
					db.postgre.connect()
					
					#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
					#Количество таблиц с именем таблицы присваивается переменной before
					before=count(name)[0][0]
					if before!=0:
						#Удаляется таблица so_search_articles
						db.postgre.conn.execute('''DROP SEQUENCE '''+name+'''_id_seq CASCADE;
						  DROP TABLE '''+name+''';
						''')
					#Количество таблиц с именем таблицы присваивается переменной after
					after=count(name)[0][0]
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					return before-after
	
				def insert(art_id,version_id):
					'''Function inserts row in the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.insert.__doc__)
					
					destination=articles.pg.table.articles.name
					source=articles.fdb.view.to_import.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается транзакция подсчета количества строк таблицы 
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination+" WHERE art_id=$1 AND version_id=$2;")
					#Количество строк присваивается переменной before
					before=count(art_id,version_id)[0][0]
					result=['INSERT',0]
					if before==0:
						#Подготавливается транзакция вставки записи в таблицу ie_so_articles
						insert = db.postgre.conn.prepare("INSERT INTO "+destination+"(art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)")
						#Выполняется подключение к базе данных Firebird
						db.firebird.connect()
						#Выполняется запрос на выборку необходимых данных:
						db.firebird.cursor.execute("SELECT * FROM "+source+" WHERE art_id=? AND version_id=?", [art_id,version_id])
						#Данные из запроса выгружаются в переменную select
						select=db.firebird.cursor.fetchall()
						#Закрывается подключение к базе данных Firebird
						db.firebird.disconnect()
						#Если количество выбранных строк не равно нулю:
						if len(select)!=0:
							#Выполняется транзакция вставки строки в таблицу
							result=insert(select[0][0],select[0][1],select[0][2],select[0][3],select[0][4],select[0][5],select[0][6],select[0][7],select[0][8],select[0][9],select[0][10],select[0][11],select[0][12])
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число вставленных строк
					return result[1]
	
	
				def insert_many(rows):
					'''Function inserts row in the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.insert_many.__doc__)
					
					name=articles.pg.table.articles.name
					#Подключение к базе данных
					db.postgre.connect()
					rows_true=[]
					artrevs=[]
					for row in rows:
						#Подготавливается транзакция выборки строки в таблице
						count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name+" WHERE art_id=$1 AND version_id=$2")
						if count(row[0],row[12])[0][0]==0 and (row[0],row[12]) not in artrevs:
							rows_true.append(row)
							artrevs.append((row[0],row[12]))
					#Подготавливается транзакция подсчета строк в таблице
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name)
					#Переменной before присваивается количество записей в таблице
					before=count()[0][0]
					#Подготавливается транзакция вставки строк в таблицу
					insert = db.postgre.conn.prepare("INSERT INTO "+name+"(art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)")
					#Выполняется транзакция вставки строк в таблицу
					insert.load_rows(rows)
					#Переменной after присваивается количество выбранных записей
					after=count()[0][0]
					#Закрывается подключение к базе данных
					db.postgre.disconnect()
					#end of function suite
					return after-before
					
				def update(id):
					'''Function updates row in the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.update.__doc__)
					destination=articles.pg.table.articles.name
					source=articles.fdb.view.to_import.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается транзакция обновления записи в таблице ie_so_articles
					update = db.postgre.conn.prepare("UPDATE "+destination+" SET section_id=$1, sectname=$2, doc_type=$3, doc_name=$4, designatio=$5, name=$6, note=$7, mu_id=$8, purchased=$9, format=$10, modifdate=$11, version_id=$12 WHERE id="+str(id))
					#Подготавливается транзакция выборки значений полей art_id, version_id для записи в таблице ie_so_articles с id=id
					select_pg = db.postgre.conn.prepare("SELECT art_id, version_id FROM "+destination+" WHERE id=$1")
					#Выполняется запрос на выборку из таблицы
					select_pg_result=select_pg(id)
					result=['UPDATE',0]
					if len(select_pg_result)==1:
						#Переменным art_id, version_id присваивается значение соответствующих полей для обновляемой записи в таблице
						art_id=select_pg_result[0].get(0)
						version_id=select_pg_result[0].get(1)
						#Выполняется подключение к базе данных Firebird
						db.firebird.connect()
						#Выполняется запрос на выборку необходимых данных из таблиц Firebird:
						db.firebird.cursor.execute("SELECT section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id FROM "+source+" WHERE art_id=? AND version_id=?", [art_id, version_id])
						#Из курсора извлекаются все строки в переменную result
						select_fdb_result=db.firebird.cursor.fetchall()
						#Закрывается подключение к базе данных Firebird
						db.firebird.disconnect()
						#Если данная ревизия данного артикула в Firebird имеется:
						if len(select_fdb_result)==1:
							#Выполняется транзакция обновления строки в таблице:
							result=update(select_fdb_result[0][0],select_fdb_result[0][1],select_fdb_result[0][2],
							select_fdb_result[0][3],select_fdb_result[0][4],select_fdb_result[0][5],
							select_fdb_result[0][6],select_fdb_result[0][7],select_fdb_result[0][8],
							select_fdb_result[0][9],select_fdb_result[0][10],select_fdb_result[0][11])
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число обновленных=извлеченных строк
					return result[1]
				
				def delete(id):
					'''Functions deletes row in the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.delete.__doc__)
					
					name=articles.pg.table.articles.name
					#Подключение к базе данных postgre
					db.postgre.connect()
					#Подготавливается транзакция удаления строки в таблице X_OASUP_ARTICLES_IMPORT
					delete=db.postgre.conn.prepare("DELETE FROM "+name+" WHERE id=$1")
					#Выполняется транзакция
					result=delete(id)
					#Закрывается подключение к базе данных postgre
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число удаленных строк
					return result[1]
	
				def news_py():
					'''Function inserts new rows in the table from Firebird'''
					#beginning of function suite
					#print(articles.pg.table.articles.news_py.__doc__)
					
					#Объявляются переменные названия таблиц
					destination=articles.pg.table.articles.name
					source=articles.fdb.view.to_import.name
					#Объявляются переменные соответствующие количеству добавленных ревизий и артикулов
					_revisions=0
					_articles=0
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Выполняется подключение к базе данных Firebird
					db.firebird.connect()
		
					#Подготавливается транзакция подсчета строк в таблице
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
					#Переменной before присваивается количество записей в таблице
					before=count()[0][0]
		
					#Вставка новых ревизий
		
					#Подготавливается транзакция выборки строк из таблицы
					pg_articles_select = db.postgre.conn.prepare("SELECT art_id, version_id FROM "+destination)
					#В переменную pg_articles записывается результат запроса на выборку строк из таблицы
					pg_articles=pg_articles_select()
					
					#Для каждой строки в результате запроса на выборку из таблицы
					for row in pg_articles:
						#Выполняется запрос на выборку из вида Firebird to_import строк с таким же art_id, но другим version_id:
						db.firebird.cursor.execute("SELECT art_id, version_id FROM "+source+" WHERE art_id="+str(row.get(0))+" AND version_id!="+str(row.get(1)))
						#Результат выполнения запроса выгружаются в переменную res_new_rev
						fdb_articles_new_rev=db.firebird.cursor.fetchall()
						if len(fdb_articles_new_rev)==1:
							#Выполняется вставка артикула в postgre
							articles.pg.table.articles.insert(fdb_articles_new_rev[0].get(0),fdb_articles_new_rev[0].get(1))
							#Выполняется вставка соответствующего артикула в таблицу Firebird imported
							articles.fdb.table.imported.insert(fdb_articles_new_rev[0].get(0), fdb_articles_new_rev[0].get(1), 'revision', 'postgre', 'articles.pg.table.articles.news_py')
							#Количество добавленных ревизий увеличивается на число вставленных строк
							_revisions=_revisions+1
		
					#Создается пустой объект класса list
					art_ids=[]
					#Для каждой строки в результате запроса на выборку строк из таблицы в лист art_ids помещается значение поля art_id
					for row in pg_articles:
						art_ids.append(row[0])
		
					#Вставка новых артикулов
						
					#Выполняется запрос на выборку всех строк из вида Firebird to_import:
					db.firebird.cursor.execute("SELECT art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id FROM "+source)
					#Все строки результата выполнения запроса выгружаются в переменную result_all
					fdb_articles_all=db.firebird.cursor.fetchall()
					
					if len(fdb_articles_all)>0:
					
						#Для каждой строки в результате запроса на выборку всех строк из вида Firebird to_import
						for row in fdb_articles_all:
							#Если art_id в строке из запроса на выборку из вида Firebird to_import отсутствует в art_ids, 
							if row[0] not in art_ids:
								#Выполняется вставка соответствующего артикула в postgre
								articles.pg.table.articles.insert(row[0],row[12])
								#Выполняется вставка соответствующего артикула в таблицу Firebird imported
								articles.fdb.table.imported.insert(row[0], row[12], 'article', 'postgre', 'articles.pg.table.articles.news_py')
								#Количество добавленных артикулов увеличивается на число вставленных строк
								_articles=_articles+1
			
					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()
					#Подготавливается транзакция подсчета строк в таблице
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
					#Переменной after присваивается количество записей в таблице
					after=count()[0][0]
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает list=[количество ревизий,количество артикулов]
					return [after-before,_revisions,_articles]

				def news():
					
					'''Function inserts new rows in the table from Firebird'''
					#beginning of function suite
					#print(articles.pg.table.articles.news_fdb.__doc__)
					
					#Объявляются переменные названия таблиц
					destination=articles.pg.table.articles.name
					source=articles.fdb.view.to_import.name
					imported=articles.fdb.table.imported.name
					#Объявляются переменные соответствующие количеству добавленных ревизий и артикулов
					_revisions=0
					_articles=0

					#Выполняется подключение к базе данных Firebird
					db.firebird.connect()
				
					#Выполняется запрос на выборку из Firebird новых ревизий уже импортированных артикулов:
					db.firebird.cursor.execute("SELECT a.art_id, a.section_id, a.sectname, a.doc_type, a.doc_name, a.designatio, a.name, a.note, a.mu_id, a.purchased, a.format, a.modifdate, a.version_id FROM "+source+" a, "+imported+" b WHERE a.ART_ID=b.ART_ID AND a.VERSION_ID!=b.VERSION_ID")
					#Все строки результата выполнения запроса выгружаются в переменную result_all
					fdb_articles_new_rev=db.firebird.cursor.fetchall()
					_revisions=len(fdb_articles_new_rev)
				
					#Выполняется запрос на выборку из Firebird новых артикулов:
					db.firebird.cursor.execute("SELECT art_id, section_id, sectname, doc_type, doc_name, designatio, name, note, mu_id, purchased, format, modifdate, version_id FROM "+source+" WHERE ART_ID NOT IN (SELECT DISTINCT ART_ID FROM "+imported+")")
					#Все строки результата выполнения запроса выгружаются в переменную result_all
					fdb_articles_new_art=db.firebird.cursor.fetchall()
					_articles=len(fdb_articles_new_art)
				
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					
					#Подготавливается транзакция подсчета строк в таблице
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
					#Переменной before присваивается количество записей в таблице
					before=count()[0][0]
					
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					
					#Выполняется вставка новых ревизий из Firebird в postgre:
					articles.pg.table.articles.insert_many(fdb_articles_new_rev)
					
					#Создается пустой объект класса лист:
					rows=[]
					#Для каждой строки в результате выполнения запроса:
					for row in fdb_articles_new_rev:
						#В список rows добавляется строка
						rows.append(row[0], row[12], 'revision', 'postgre', 'articles.pg.table.articles.news_fdb')
					#Выполняется вставка строк в таблицу Firebird imported:
					articles.fdb.table.imported.insert_many(rows)
					
					#Выполняется транзакция вставки новых артикулов из Firebird в postgre:
					articles.pg.table.articles.insert_many(fdb_articles_new_art)
					
					#Создается пустой объект класса лист:
					rows=[]
					#Для каждой строки в результате выполнения запроса:
					for row in fdb_articles_new_art:
						#В список rows добавляется строка
						rows.append((row[0], row[12], 'article', 'postgre', 'articles.pg.table.articles.news_fdb'))
					#Выполняется вставка строк в таблицу Firebird imported:
					articles.fdb.table.imported.insert_many(rows)

					#Закрывается подключение к базе данных Firebird
					db.firebird.disconnect()

					#Выполняется подключение к базе данных postgres
					db.postgre.connect()

					#Подготавливается транзакция подсчета строк в таблице
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
					#Переменной after присваивается количество записей в таблице
					after=count()[0][0]

					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
				
					#end of function suite
					#Функция возвращает list=[всего записей, из них ревизий, из них артикулов]
					return [after-before, _revisions,_articles]
				
				def empty():
					'''Function empties the table'''
					#beginning of function suite
					#print(articles.pg.table.articles.empty.__doc__)
					
					name=articles.pg.table.articles.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается запрос на удаление всех записей из таблицы
					delete=db.postgre.conn.prepare("DELETE FROM "+name)
					#Выполняется запрос на удаление записей из таблицы
					result=delete()
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число удаленных строк
					return result[1]


class konstrobj:
	"This class is a manipulator for konstrobj"
	#print (articles.pg.table.konstrobj.__doc__)
	#beginning of class suite
	class ora:
		"This class is a manipulator in oracle"
		#beginning of class suite
		#print (konstrobj.ora.__doc__)
		class view:
			"This class is a manipulator for views"
			#beginning of class suite
			#print (konstrobj.ora.view.__doc__)
			
			class to_import:
				"This class is a manipulator for to_import"
				#beginning of class suite
				#print (konstrobj.ora.view.to_import.__doc__)
				
				name='X_OASUP_SO_KOBJ_TO_IMPORT'
				
				def create():
					'''Function creates the view'''
					#beginning of function suite
					#print(konstrobj.ora.view.to_import.create.__doc__)
					
					name=konstrobj.ora.view.to_import.name
					#Выполняется подключение к базе данных Oracle
					db.oracle.connect()
					
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
					#Количество видов с именем вида присваивается переменной before
					before=db.oracle.cursor.fetchall()[0][0]
					if before==0:
					
						# Выполняется запрос на создание вида в Oracle:
						db.oracle.cursor.execute(''' CREATE OR REPLACE NOFORCE VIEW "OMP_ADM"."'''+name+'''" 
					
					("UNVCODE", "REVISION", "ITEMTYPE", "ITEMTYPE_NAME", "SIGN", "NAME", "NOTICE", "MEASCODE", "MEASNAME", "SUPPLYTYPE", "FORMAT", "OWNER", "OWNER_NAME", "RECDATE", "PRODCODE", "OMP_OBJECTS_CODE", "FIRST_PROMCODE", "LAST_PROMCODE", "CURRENT_STATE", "STATEDATE", "LASTNAME") 
					
					AS 
					
					SELECT a.UNVCODE, a.REVISION, a.ITEMTYPE, b."NAME" AS "ITEMTYPE_NAME", a.SIGN,
a."NAME", a.NOTICE, a.MEASCODE, c."NAME" as MEASNAME, a.SUPPLYTYPE, a.FORMAT, 
a.OWNER, d."NAME" as "OWNER_NAME", a.RECDATE, a.PRODCODE, e.CODE as "OMP_OBJECTS_CODE",
g.CODE as "FIRST_PROMCODE", h.CODE as "LAST_PROMCODE", i.CURRENT_STATE, i.STATEDATE, i.LASTNAME


FROM OMP_ADM.KONSTROBJ a, OMP_ADM.KO_TYPES b, 
    OMP_ADM.MEASURES c, OMP_ADM.OWNER_NAME d,
    OMP_ADM.BUSINESS_OBJECTS e,
    
    (SELECT a.DOCCODE as "UNVCODE", MIN(b.CODE) AS "CODE"
        FROM OMP_ADM.BUSINESS_OBJECTS a, OMP_ADM.BUSINESSOBJ_PROMOTION b, OMP_ADM.BUSINESSOBJ_STATES c
            WHERE b.BUSINESSOBJ=a.CODE
                AND c.CODE=b.CURRENT_STATE
                AND a."TYPE" IN (0,1,2,3,4,5,6,22)
        GROUP BY a.DOCCODE) g,

    (SELECT a.DOCCODE as "UNVCODE", MAX(b.CODE) AS "CODE"
        FROM OMP_ADM.BUSINESS_OBJECTS a, OMP_ADM.BUSINESSOBJ_PROMOTION b, OMP_ADM.BUSINESSOBJ_STATES c
            WHERE b.BUSINESSOBJ=a.CODE
                AND c.CODE=b.CURRENT_STATE
                AND a."TYPE" IN (0,1,2,3,4,5,6,22)
        GROUP BY a.DOCCODE) h,

    (SELECT a.CODE, b."NAME" as "CURRENT_STATE", a.STATEDATE, a.LASTNAME 
        FROM OMP_ADM.BUSINESSOBJ_PROMOTION a, OMP_ADM.BUSINESSOBJ_STATES b
            WHERE b.CODE=a.CURRENT_STATE) i

            
            WHERE b.CODE=a.ITEMTYPE
                AND c.CODE=a.MEASCODE
                AND d.OWNER=a.OWNER
                AND e.DOCCODE=a.UNVCODE
                AND e."TYPE"=a.ITEMTYPE
                AND g.UNVCODE=a.UNVCODE
                AND h.UNVCODE=a.UNVCODE
                AND h.CODE=i.CODE
                AND a.ITEMTYPE IN (0,1,2,3,4,5,6,22)''')

					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
					#Количество видов с именем вида присваивается переменной after
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных Oracle
					db.oracle.disconnect()
					#end of function suite
					return after-before

				def drop():
					'''Function drops the view'''
					#beginning of function suite
					#print(articles.fdb.view.to_import.drop.__doc__)
					
					name=konstrobj.ora.view.to_import.name
					#Выполняется подключение к базе данных
					db.oracle.connect()
					
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
					#Количество видов с именем вида присваивается переменной before
					before=db.oracle.cursor.fetchall()[0][0]
					if before!=0:
						# Выполняется запрос на уничтожение вида:
						db.oracle.cursor.execute('''DROP VIEW "OMP_ADM"."'''+name+'''"''')
					#Выполняется транзакция подсчета количества видов с именем вида в каталоге видов
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_VIEWS WHERE VIEW_NAME=:VIEW_NAME",VIEW_NAME=name)
					#Количество видов с именем вида присваивается переменной after
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return before-after

				#end of to_import class suite
			
			#end of view class suite

		class table:
			"This class is a manipulator for tables"
			#beginning of class suite
			#print (konstrobj.ora.table.__doc__)

			class imported:
				"This class is a manipulator for imported items"
				#beginning of class suite
				#print (konstrobj.ora.table.imported.__doc__)
				
				name='X_OASUP_SO_KOBJ_IMPORTED'
				
				def create():
					'''Function creates the table'''
					#beginning of function suite
					#print(konstrobj.ora.table.imported.create.__doc__)
					
					name=konstrobj.ora.table.imported.name
					#Выполняется подключение к базе данных
					db.oracle.connect()
					
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=:TABLE_NAME",TABLE_NAME=name)
					#Количество таблиц с именем таблицы присваивается переменной before
					before=db.oracle.cursor.fetchall()[0][0]
					if before==0:
						# Выполняется запрос на создание таблицы:
						db.oracle.cursor.execute('''CREATE TABLE '''+name+''' 
						(
						  UNVCODE Integer NOT NULL,
						  INSDATE Timestamp NOT NULL,
						  DB Varchar(70) NOT NULL,
						  "COMMENT" Varchar(252),
						  CONSTRAINT '''+name+'''_pk PRIMARY KEY (UNVCODE)
						 )''')
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=:TABLE_NAME",TABLE_NAME=name)
					#Количество таблиц с именем таблицы присваивается переменной after
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return after-before

				def drop():
					'''Function drops the table'''
					#beginning of function suite
					#print(articles.fdb.table.imported.drop.__doc__)
					
					name=konstrobj.ora.table.imported.name
					#Выполняется подключение к базе данных
					db.oracle.connect()
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=:TABLE_NAME",TABLE_NAME=name)
					#Количество таблиц с именем таблицы присваивается переменной before
					before=db.oracle.cursor.fetchall()[0][0]
					if before!=0:
						# Выполняется запрос на уничтожение таблицы
						db.oracle.cursor.execute('''DROP TABLE '''+name+''' CASCADE CONSTRAINTS''')
					#Выполняется транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					db.oracle.cursor.execute("SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME=:TABLE_NAME",TABLE_NAME=name)
					#Количество таблиц с именем таблицы присваивается переменной after
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return before-after
			
				def insert(unvcode, database='postgre', comment=''):
					'''Function inserts row in the table'''
					#beginning of function suite
					#print(konstrobj.ora.table.imported.insert.__doc__)
					
					name=konstrobj.ora.table.imported.name
					#Подключение к базе данных
					db.oracle.connect()
					#Выполняется транзакция выборки строки в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name+" WHERE UNVCODE=:UNVCODE",UNVCODE=unvcode)
					#Переменной before присваивается количество выбранных записей
					before=db.oracle.cursor.fetchall()[0][0]
					if before==0:
						#Выполняется транзакция вставки строки в таблицу
						db.oracle.cursor.execute('''INSERT INTO '''+name+''' (UNVCODE, INSDATE, DB, "COMMENT") VALUES(:UNVCODE,sysdate,:DB,:COM)''',UNVCODE=unvcode, DB=database, COM=comment)
						#Commit
						db.oracle.conn.commit()
					#Выполняется транзакция выборки строк в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name+" WHERE UNVCODE=:UNVCODE",UNVCODE=unvcode)
					#Переменной after присваивается количество выбранных записей
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return after-before
					
				def insert_many(rows):
					'''Function inserts row in the table'''
					#beginning of function suite
					#print(konstrobj.ora.table.imported.insert_many.__doc__)
					
					name=konstrobj.ora.table.imported.name
					#Подключение к базе данных
					db.oracle.connect()
					rows_true=[]
					unvcodes=[]
					for row in rows:
						#Выполняется транзакция выборки строки в таблице
						db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name+" WHERE UNVCODE=:UNVCODE",UNVCODE=row[0])
						if db.oracle.cursor.fetchall()[0][0]==0 and row[0] not in unvcodes:
							rows_true.append(row)
							unvcodes.append(row[0])
					#Выполняется транзакция выборки строк в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name)
					#Переменной before присваивается количество выбранных записей
					before=db.oracle.cursor.fetchall()[0][0]
					#Выполняется транзакция вставки строк в таблицу
					db.oracle.cursor.executemany('''INSERT INTO '''+name+''' (UNVCODE, INSDATE, DB, "COMMENT") VALUES(:UNVCODE,sysdate,:DB,:COM)''',rows_true)
					#Commit
					db.oracle.conn.commit()
					#Выполняется транзакция выборки строк в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name)
					#Переменной after присваивается количество выбранных записей
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return after-before

				def delete(unvcode):
					'''Function deletes row in the table'''
					#beginning of function suite
					#print(konstrobj.oracle.table.imported.delete.__doc__)
					
					name=konstrobj.ora.table.imported.name
					#Подключение к базе данных
					db.oracle.connect()
					#Выполняется транзакция выборки строки в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name+" WHERE UNVCODE=:UNVCODE",UNVCODE=unvcode)
					#Переменной before присваивается количество выбранных записей, которые будут удалены
					before=db.oracle.cursor.fetchall()[0][0]
					if before>0:
						#Выполняется транзакция удаления строки в таблице
						db.oracle.cursor.execute("DELETE FROM "+name+" WHERE UNVCODE=:UNVCODE",UNVCODE=unvcode)
						#Commit
						db.oracle.conn.commit()
					#Выполняется транзакция выборки строк в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name+" WHERE UNVCODE=:UNVCODE",UNVCODE=unvcode)
					#Переменной after присваивается количество выбранных записей
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return before-after
				
				def empty():
					'''Function deletes all rows in the table'''
					#beginning of function suite
					#print(konstrobj.ora.table.imported.empty.__doc__)
					
					name=konstrobj.ora.table.imported.name
					#Подключение к базе данных
					db.oracle.connect()
					#Выполняется транзакция выборки строки в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name)
					#Переменной before присваивается количество выбранных записей, которые будут удалены
					before=db.oracle.cursor.fetchall()[0][0]
					#Выполняется транзакция удаления всех строк в таблице
					db.oracle.cursor.execute("DELETE FROM "+name)
					#Commit
					db.oracle.conn.commit()
					#Выполняется транзакция выборки строк в таблице
					db.oracle.cursor.execute("SELECT COUNT(*) FROM "+name)
					#Переменной after присваивается количество выбранных записей
					after=db.oracle.cursor.fetchall()[0][0]
					#Закрывается подключение к базе данных
					db.oracle.disconnect()
					#end of function suite
					return before-after
				
				#end of imported class suite
			
			#end of table class suite

		#end of ora class suite
		

	class pg:
		"This class is a manipulator for konstrobj items in postgre"
		#print (konstrobj.pg.__doc__)
		#beginning of class suite
		
		class table:
			"This class is a manipulator for tables"
			#print (konstrobj.pg.table.__doc__)
			#beginning of class suite
			
			class konstrobj:
				"This class is a manipulator for konstrobj"
				#print (konstrobj.pg.table.konstrobj.__doc__)
				#beginning of class suite	
				
				name='ei_so_omega_konstrobj'
				def create():
					'''Function creates the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.create.__doc__)
					
					name=konstrobj.pg.table.konstrobj.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
					#Количество таблиц с именем таблицы присваивается переменной before
					before=count(name)[0][0]
					if before==0:
						#Подготавливается транзакция создания таблицы
						create=db.postgre.conn.execute('''CREATE TABLE '''+name+''' 
						(
						  unvcode integer NOT NULL, --Omega.konstrobj
						  revision integer NOT NULL, --Omega.konstrobj
						  itemtype integer NOT NULL, --Omega.konstrobj
						  itemtype_name character varying(40) NOT NULL, --Omega.ko_types.name 
						  sign character varying(100) NOT NULL, --Omega.konstrobj
						  name character varying(200), --Omega.konstrobj
						  notice character varying(100), --Omega.konstrobj
						  meascode integer NOT NULL, --Omega.konstrobj
						  measname character varying(40) NOT NULL, --Omega.measures.name 
						  supplytype integer NOT NULL, --Omega.konstrobj
						  format character varying(15), --Omega.konstrobj
						  owner integer NOT NULL, --Omega.konstrobj
						  owner_name character varying(100) NOT NULL, --Omega.owner_name
						  recdate timestamp NOT NULL, --Omega.konstrobj
						  prodcode integer NOT NULL, --Omega.konstrobj
						  omp_objects_code integer NOT NULL, -- Omega.omp_objects.code
						  first_promcode integer NOT NULL, -- Omega.businessobj_promotion.code
						  last_promcode integer NOT NULL, -- Omega.businessobj_promotion.code
						  current_state character varying(40), -- Omega.businessobj_states.name
						  statedate timestamp NOT NULL, -- Omega.businessobj_promotion.statedate
						  lastname character varying(40) NOT NULL, -- Omega.businessobj_promotion.lastname
						  CONSTRAINT '''+name+'''_pkey PRIMARY KEY (unvcode)
						 );
						ALTER TABLE '''+name+''' OWNER TO openerp;
						COMMENT ON TABLE '''+name+''' IS 'Таблица конструкторских элементов Omega';
						''')
					#Количество таблиц с именем таблицы присваивается переменной after
					after=count(name)[0][0]
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					return after-before

				def drop():
					'''Function drops the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.drop.__doc__)
					
					name=konstrobj.pg.table.konstrobj.name
					#Выполняется подключение к базе данных postgres с заданными параметрами
					db.postgre.connect()
					#Подготавливается транзакция подсчета количества таблиц с именем таблицы в каталоге таблиц
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM pg_tables WHERE tablename=$1;")
					#Количество таблиц с именем таблицы присваивается переменной before
					before=count(name)[0][0]
					if before!=0:
						#Удаляется таблица so_search_articles
						db.postgre.conn.execute('''DROP TABLE '''+name+''';''')
					#Количество таблиц с именем таблицы присваивается переменной after
					after=count(name)[0][0]
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					return after-before

				def delete(unvcode):
					'''Functions deletes row in the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.delete.__doc__)
					
					name=konstrobj.pg.table.konstrobj.name
					#Подключение к базе данных postgre
					db.postgre.connect()
					#Подготавливается транзакция удаления строки в таблице
					delete=db.postgre.conn.prepare("DELETE FROM "+name+" WHERE unvcode=$1")
					#Выполняется транзакция
					result=delete(unvcode)
					#Закрывается подключение к базе данных postgre
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число удаленных строк
					return result[1]

				def insert(unvcode):
					'''Function inserts row in the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.insert.__doc__)
					
					destination=konstrobj.pg.table.konstrobj.name
					source=konstrobj.ora.view.to_import.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Выполняется транзакция выборки строк в таблице
					select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination+" WHERE unvcode=$1")
					#Переменной before присваивается количество выбранных записей, которые будут удалены
					before=select(unvcode)[0][0]
					if before==0:
						#Подготавливается транзакция вставки записи в таблицу
						insert=db.postgre.conn.prepare("INSERT INTO "+destination+"(unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21)")
						#Выполняется подключение к базе данных oracle
						db.oracle.connect()
						#Выполняется запрос на выборку необходимых данных из вида в oracle:
						db.oracle.cursor.execute("SELECT * FROM "+source+" WHERE UNVCODE=:UNVCODE", UNVCODE=unvcode)
						#Из курсора все строки загружаются в таблицу
						insert.load_rows(db.oracle.cursor.fetchall())
						#Закрывается подключение к базе данных oracle
						db.oracle.disconnect()
					#Выполняется транзакция выборки строк в таблице
					select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination+" WHERE unvcode=$1")
					#Переменной after присваивается количество выбранных записей, которые будут удалены
					after=select(unvcode)[0][0]
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число вставленных строк
					return after-before

				def insert_many(rows):
					'''Function inserts rows in the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.insert_many.__doc__)
					
					name=konstrobj.pg.table.konstrobj.name
					#Подключение к базе данных
					db.postgre.connect()
					rows_true=[]
					unvcodes=[]
					for row in rows:
						#Подготавливается транзакция подсчета строк в таблице
						count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name+" WHERE unvcode=$1")
						if count(row[0])[0][0]==0 and row[0] not in unvcodes:
							rows_true.append(row)
							unvcodes.append(row[0])
					#Подготавливается транзакция подсчета строк в таблице
					count=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+name)
					#Переменной before присваивается количество записей в таблице
					before=count()[0][0]
					#Подготавливается транзакция вставки записи в таблицу
					insert=db.postgre.conn.prepare("INSERT INTO "+name+"(unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21)")
					#Выполняется транзакция вставки строк в таблицу
					insert.load_rows(rows)
					#Переменной after присваивается количество записей в таблице
					after=count()[0][0]
					#Закрывается подключение к базе данных
					db.postgre.disconnect()
					#end of function suite
					return after-before


				def update(unvcode):
					'''Function updates row in the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.update.__doc__)
					destination=konstrobj.pg.table.konstrobj.name
					source=konstrobj.ora.view.to_import.name

					#Выполняется подключение к базе данных oracle
					db.oracle.connect()
					#Выполняется запрос на выборку данных для unvcode=unvcode:
					db.oracle.cursor.execute("SELECT unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname FROM "+source+" WHERE unvcode=:UNVCODE", UNVCODE=unvcode)
					#Из курсора извлекаются данные в переменную result
					select=db.oracle.cursor.fetchall()
					#Закрывается подключение к базе данных oracle
					db.oracle.disconnect()
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается транзакция обновления записи:
					update = db.postgre.conn.prepare("UPDATE "+destination+" SET unvcode=$1, revision=$2, itemtype=$3, itemtype_name=$4, sign=$5, name=$6, notice=$7, meascode=$8, measname=$9, supplytype=$10, format=$11, owner=$12, owner_name=$13, recdate=$14, prodcode=$15, omp_objects_code=$16, first_promcode=$17, last_promcode=$18, current_state=$19, statedate=$20, lastname=$21 WHERE unvcode="+str(unvcode))
					#Выполняется транзакция обновления записи:
					result=update(select[0][0], select[0][1], select[0][2], select[0][3], select[0][4], select[0][5], select[0][6], select[0][7], select[0][8], select[0][9], select[0][10], select[0][11], select[0][12], select[0][13], select[0][14], select[0][15], select[0][16], select[0][17], select[0][18], select[0][19], select[0][20])
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число обновленных строк
					return result[1]
				
				def news():
					'''Function inserts new rows in the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.news.__doc__)
					
					#Объявляются переменные названия таблиц
					destination=konstrobj.pg.table.konstrobj.name
					source=konstrobj.ora.view.to_import.name
					imported=konstrobj.ora.table.imported.name
					
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					
					#Подготавливается транзакция выборки последнего значения unvcode в таблице
					last = db.postgre.conn.prepare("SELECT MAX(UNVCODE) FROM "+destination)
					#Результат выполнения транзакции записывается в переменную unvcode
					unvcode = last()[0][0]
					#Если таблица пуста, unvcode присваивается нулевое значение
					if unvcode==None:
						unvcode=0
					#Выполняется подключение к базе данных oracle
					db.oracle.connect()
					#Выполняется запрос на выборку новых записей:
					db.oracle.cursor.execute("SELECT unvcode, revision, itemtype, itemtype_name, sign, name, notice, meascode, measname, supplytype, format, owner, owner_name, recdate, prodcode, omp_objects_code, first_promcode, last_promcode, current_state, statedate, lastname FROM "+source+" WHERE unvcode>:UNVCODE", UNVCODE=unvcode)
					
					#Выполняется транзакция выборки строк в таблице
					select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
					#Переменной before присваивается количество выбранных записей, которые будут удалены
					before=select()[0][0]
					
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					
					#Из курсора все строки загружаются в таблицу
					konstrobj.pg.table.konstrobj.insert_many(db.oracle.cursor.fetchall())
					
					#Закрывается подключение к базе данных oracle
					db.oracle.disconnect()
					
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()

					#Выполняется транзакция выборки строк в таблице
					select=db.postgre.conn.prepare("SELECT COUNT(*) FROM "+destination)
					#Переменной before присваивается количество выбранных записей, которые будут удалены
					after=select()[0][0]

					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
				
					#end of function suite
					#Функция возвращает количество добавленных записей
					return after-before

				def empty():
					'''Function empties the table'''
					#beginning of function suite
					#print(konstrobj.pg.table.konstrobj.empty.__doc__)
					
					name=konstrobj.pg.table.konstrobj.name
					#Выполняется подключение к базе данных postgres
					db.postgre.connect()
					#Подготавливается запрос на удаление всех записей из таблицы
					delete=db.postgre.conn.prepare("DELETE FROM "+name)
					#Выполняется запрос на удаление записей из таблицы
					result=delete()
					#Закрывается подключение к базе данных postgres
					db.postgre.disconnect()
					#end of function suite
					#Функция возвращает число удаленных строк
					return result[1]



#Документация

	#OMP_OBJECTS
		#OMP_OBJECTS_CODE=SQ_BUSINESS_OBJECTS_CODE.NEXTVAL
		
	#BO_PRODUCTION
		#BO_PRODUCTION_CODE={SELECT CODE FROM BO_PRODUCTION WHERE SIGN=NEW.SIGN AND TYPE=NEW.ITEMTYPE
					#IF NOT FOUND SQ_PRODUCTION.NEXTVAL}
	#KONSTROBJ
		#UNVCODE=SQ_UNVCODE.NEXTVAL
		#REVISION={SELECT * FROM KONSTROBJ WHERE PRODCODE=NEW.PRODCODE
					#IF NOT FOUND THEN 0 
						#ELSE SELECT MAX(REVISION)+1 FROM KONSTROBJ WHERE PRODCODE=NEW.PRODCODE}
		
		
		#ITEMTYPE=0 (ARTICLES.SECTION_ID)
		#SIGN=ARTICLES.DESIGNATIO
		#NAME=ARTICLES.NAME
		#NOTICE=ARTICLES.NOTE
		#MEASCODE=ARTICLES.MU_ID // 106
		#SUPPLYTYPE=ARTICLES.PURCHASED // 0
		#FORMAT=DOCLIST.FORMAT
		#OWNER=188
		#RECDATE=sysdate

		
	#BUSINESS_OBJECTS
		#BUSINESS_OBJECTS_CODE=SQ_BUSINESS_OBJECTS_CODE.CURRVAL

#BUSINESSOBJ_PROMOTION
		#BUSINESSOBJ_PROMOTION_CODE=SQ_BUSINESSOBJ_PROMOTION_CODE.NEXTVAL







#class oracle:
#		"This class is a manipulator for articles instances in oracle"
#		#print (articles.oracle.__doc__)
#		#beginning of class suite
#		
#		class table:
#			"This class is a manipulator for tables"
#			#print (articles.oracle.table.__doc__)
#			#beginning of class suite
#			
#			class konstrobj:
#				"This class is a manipulator for konstrobj"
#				#print (articles.oracle.table.konstrobj.__doc__)
#				#beginning of class suite
#				
#				name='konstrobj'
					
				#end of articles class suite	
				
			#end of table class suite
		
		#end of pg class suite


#Вывод ошибок возвращается "в исходное положение"

#sys.stderr.close()
#sys.stderr = sys.__stderr__